perm filename WINDOW.FAI[XAP,BGB]1 blob sn#047863 filedate 1973-06-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE WINDOW
C00003 00003	Fields:
C00005 00004	Node format:
C00007 00005	Subroutines MKNODE,KLNODE
C00010 00006	NSUBR(MORCOR)------------------------------------------------------
C00012 00007	Subroutines RINGIN,RINGOUT,INORDER
C00015 00008	NSUBR COPNOD,NODE
C00016 00009	NSUBR MKPAGE,NUMBER,TEMPLATE
C00017 ENDMK
C⊗;
	TITLE WINDOW

INTERN DOCUMENT,BLKCNT,AVAIL,REMAINDER
	NODSIZ←←4
	OLDFF:	  0
	DOCUMENT: 0
	BLKCNT:   0
	AVAIL:	  0
	TMPLT:	  0
	REMAINDER:0
;Fields:

DEFINE LFIELD $(NAME,OFFSET,TYPE)
{IFIDN <TYPE><>
<DEFINE NAME(AC,NODE)
{	HLRZ AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{	HRLM AC,OFFSET(NODE)
}>
IFIDN <TYPE><I>
<DEFINE NAME(AC,NODE)
{	HLRE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{	HRLM AC,OFFSET(NODE)
}>
IFIDN <TYPE><F>
<DEFINE NAME(AC,NODE)
{	HLLE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{	HLLM AC,OFFSET(NODE)
}>}

DEFINE RFIELD $(NAME,OFFSET,TYPE)
{IFIDN <TYPE><>
<DEFINE NAME(AC,NODE)
{	HRRZ AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{	HRRM AC,OFFSET(NODE)
}>
IFIDN <TYPE><I>
<DEFINE NAME(AC,NODE)
{	HRRE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{	HRRM AC,OFFSET(NODE)
}>
IFIDN <TYPE><F>
<DEFINE NAME(AC,NODE)
{	HRLE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{	HLRM AC,OFFSET(NODE)
}>}
;____________________________________________________________________

	LFIELD(CW,0)↔		RFIELD(CCW,0)
	LFIELD(DAD,1)↔		RFIELD(SON,1)
	LFIELD(CMIN,2,N)↔	RFIELD(CMAX,2,N)
	LFIELD(RMIN,3,N)↔	RFIELD(RMAX,3,N)
				RFIELD(PAGNO,3,N)
				RFIELD(PTYPE,3)
				RFIELD(ATYPE,3)
	↓COL←←2
	↓ROW←←3
;Node format:

COMMENT $

1. Document

   ---------------------
0 |   ---	AVAIL	|
1 |   --- 	SON	|	SON(DOCUMENT)=PAGE
2 |   ---	Blkcnt  |
3 |  		TMPLT	|	PAGE template ring
   ---------------------

2. Page Node

   ---------------------
0 |  CW		CCW	|	Previous and next pages.
1 |  DAD	SON	|	DAD(PAGE)=DOCUMENT, SON(PAGE)=AREA
2 |		Pageno	|
3 |		Ptype 	|	Page type bits
   ---------------------

3. Area

   ---------------------
0 |  CW		CCW	|	Previous and next areas
1 |  DAD	SON	|	DAD(AREA)=PAGE, SON(AREA)=WINDOW
2 |	 Pname		|
3 |  		Atype 	|	Page number, Area type bits
   ---------------------

4. Window

   ---------------------
0 |  CW		CCW	|	Previous and next windows
1 |  DAD	 ---	|	DAD(WINDOW)=PAGE
2 |  cmin	cmax	|	Min and max columns
3 |  rmin	rmax	|	Min and max rows
   ---------------------

0. Empty

   ---------------------
0 |   -1	AVAIL	|	Next free node
1 |  			|
2 |			|
3 |			|
   ---------------------
;Subroutines MKNODE,KLNODE
;____________________________________________________________________
NSUBR(MKNODE)
; ALLOCATE A NODSIZ BLOCK OF WORDS - BGB - 4 DEC 1972.
	SKIPN 1,@AVAIL
	CALL(MORCOR)
	HRRZ(1)↔HRRM @AVAIL
	SETZM(1)↔AOS @BLKCNT
	POP0J
SUBREND MKNODE
;____________________________________________________________________
NSUBR(KLNODE,NODE)
; RELEASE A NODSIZ BLOCK OF WORDS - BGB - 4 DEC 1972.
	MOVE 1,NODE
	SKIPGE (1)↔GO [ OUTSTR[ASCIZ/EMPTY NODE KILLED!
/]↔POP1J ]
	SOS @BLKCNT
	SETZM(1)↔HRLI(1)↔HRRI 1(1)↔BLT NODSIZ-1(1)
	MOVE @AVAIL↔HRROM(1)↔HRRZM 1,@AVAIL
;	POP1J
	SUB P,[XWD 2,2]↔POPJ P,	;Faster
SUBREND KLNODE
NSUBR(MORCOR)------------------------------------------------------
;GET MORE CORE - BGB - 4 DEC 1972.

;INITIALIZE DOCUMENT BLOCK POINTERS WHEN NECESSARY.
;	SKIPE OLDFF↔GO L1
	SKIPE OLDFF↔GO [ FATAL(NODE SPACE FULL) ]
	MOVE 1,JOBFF↔MOVEM 1,OLDFF
;	AOS 1↔MOVEM 1,DOCUMENT
;	ADDI 1,3↔MOVEM 1,AVAIL
;	AOS 1↔MOVEM 1,BLKCNT
	MOVEM 1,DOCUMENT
	MOVEM 1,AVAIL
	ADDI 1,2↔MOVEM 1,BLKCNT
	AOS 1↔MOVEM 1,TMPLT
	SETZM REMAINDER

;FOUR MORE K !
L1:	MOVE 1,JOBFF↔MOVE 0,1↔ADDI 0,10000
	HRRE 0,0↔JUMPL 0,[FATAL(127K MAX FOR TVFONT, YOU LOSE)]
	CALLI 11↔GO[FATAL(NO MORE CORE.)]
	AOS 1↔SUB 1,REMAINDER↔MOVEM 2,AC2#↔MOVE 2,JOBFF
	SETZM(1)↔LIPI(1)↔LAPI(1)1↔BLT(2)

;MAKE AVAIL LIST.
	HRLM 1,1↔ADD 1,[XWD NODSIZ,0]
	SKIPE @BLKCNT↔GO .+3
	ADD 1,[XWD NODSIZ,NODSIZ]↔AOS@BLKCNT
	DAPZ 1,@AVAIL
L2:	HLROM 1,(1)↔ADD 1,[XWD NODSIZ,NODSIZ]
	CAILE 2,NODSIZ+NODSIZ-1(1)↔GO L2
	SUBI 2,NODSIZ-1(1)↔MOVEM 2,REMAINDER
;	MOVEI 10000↔ADDM @DOCUMENT
;	MOVE 1,DOCUMENT↔MOVE[FILBIT+010000]↔MOVEM 2(1)
	MOVE 1,@AVAIL
	MOVE 2,AC2↔POP0J
SUBREND;12/16/72-----------------------------------------------------
;Subroutines RINGIN,RINGOUT,INORDER
;____________________________________________________________________
NSUBR RINGIN,PART,WHOLE
;RING PART INTO A WHOLE -BGB- 6 DEC 1972.
	MOVE 1,PART
	MOVE 3,WHOLE
	DAD. 3,1
	SON 2,3
	JUMPE 2,[SON. 1,3↔CW. 1,(1)↔CCW. 1,(1)↔POP2J]
	CW 3,(2)
	CW. 3,(1)↔CCW. 1,(3)
	CCW. 2,(1)↔CW. 1,(2)
	POP2J
SUBREND RINGIN
;____________________________________________________________________
NSUBR RINGOUT,NODE
;Remove node from ring.  -TVR- 9 JUN 1973
	HRRZ 2,NODE	;Get node
	CCW 1,2		;Get next into 1
	CW 3,2		;Previous into 3
	CCW.3,1		;Make previous's next point to node's next
	CCW.1,3		;Make next's previous point to node's previous
	DAD 3,2		;Is node the head of ring?
	SON 0,3
	CAMN 0,2
	SON. 1,3	;Yes, new head of ring
	POP1J
SUBREND RINGOUT
;____________________________________________________________________
NSUBR INORDER,NODE,NUMBER,RING,FETCH
;Insert node into ring in order!
	NEW←3
	LAC NEW,NODE	;Get node
	LAC 2,RING	;And pointer to ring
	DAD. 2,NEW	;Make it DAD of new node
	SON 1,2		;Does he have a son?
	JUMPE 1,NEWRING
LOOP:	XCT FETCH	;Fetch value
	CAML 0,NUMBER	;Does value of this node come after new node?
	GO FOUND	;Yes, then we have found it
	CCW 1,1		;No, get next node
	CAME 1,RING	;Have we reached the end?
	GO LOOP		;No, try again
ADDNOD:	CW 2,1		;Insert new node before this node
	CW. 2,NEW↔CW. NEW,1	;Clockwise pointers
	CCW. 1,NEW↔CCW. 3,NEW	;CounterClockwise pointers
	POP4J
FOUND:	SON 0,2		;Get back head of ring
	CAMN 0,2	;Before head of ring?
	SON. NEW,2	;Yes, new ring leader!
	GO ADDNOD	;Make the rest of the links
NEWRING:SON. NEW,2	;Make new ring
	CW. NEW,(NEW)↔CCW. NEW,(NEW)	;A ring of one
	POP4J
SUBREND INORDER
NSUBR COPNOD,NODE
	ACCUMULATORS{N}
	LAP N,NODE
	CALL MKNODE
	LAC 0,2(N)
	DAC 0,2(1)
	LAC 0,3(N)
	DAC 0,3(1)
	SON 0,N
	JUMPE 0,POP1J.
	CALL COPRING,0,1
SUBREND COPNOD
;____________________________________________________________________
NSUBR COPRING,OLDSON,NEWDAD
	ACCUMULATORS{N}
	LAP N,OLDSON
LOOP:	CALL COPNOD,N
	PUSHP 1(P)
	CALL RINGIN,1,NEWDAD
	POPP N
	CAME N,OLDSON
	GO LOOP
	POP1J
SUBREND COPNOD
NSUBR MKPAGE,NUMBER,TEMPLATE
	CALL MKNODE
	DAC 1,NEWPAG
	LAC 0,NUMBER
	PAGNO. 0,1
	CALL(INORDER,1,NUMBER,DOCUMENT,[PAGNO 0,1])
	CALL COPNOD,TEMPLATE
	CALL RINGIN,1,NEWPAG
	POP1J

	DECLARE{NEWPAG}
SUBREND MKPAGE